package com.geek.javase.ch11.work.streamwork;

import java.util.*;

/*
 *@author wangpeng
 *2025/10/22 17:43
 *@description TODO
 */

//1.练习Stream中的常用方法of()、iterate()、generate()、findFirst()、findAny()、anyMatch()、distinct()等
//2.筛选出Integer集合中大于7的元素，并打印，例如6,7,3,8,1,2,9
//3.筛选员工中工资高于8000的人，并形成新的集合
//4.获取String集合中最长的元素
//5.获取Integer集合中最大值
//6.获取员工工资最高的人
//7.计算Integer集合中大于6的元素的个数
//8.将员工按照工资由低到高排序，显示名字
//9.将员工按照工资由高到低排序，显示名字
//10.将员工按照工资由低到高（工资一样则按年龄由小到大）排序，显示名字
public class Demo1 {
    public static void main(String[] args) {

        //2.筛选出Integer集合中大于7的元素，并打印，例如6,7,3,8,1,2,9
        //Arrays.asList 的作用是将一个数组（或一组可变参数）转换为一个 List 集合。
        List<Integer> nums = Arrays.asList(6,7,3,8,1,2,9);
        nums.stream().filter(s->s>7).forEach(System.out::println);

        //3.筛选员工中工资高于8000的人，并形成新的集合
        List<Employee> employees = Arrays.asList(
                new Employee("zhangsan",18,3000.0),
                new Employee("lisi",19,5000.0),
                new Employee("wangwu",20,6000.0),
                new Employee("zhaoliu",21,7000.0),
                new Employee("qianqi",22,9000.0));
        employees.stream().filter(s->s.getSalary()>8000.0).forEach(System.out::println);

        //4.获取String集合中最长的元素
        List<String> longString = Arrays.asList("zhangsan","lisi","wangwu");
        //Comparator.comparingInt(String::length) 创建一个比较器，按字符串长度比较
        //max() 方法返回流中的最大元素,返回 Optional<String>，因为集合可能为空
        Optional<String> longestString = longString.stream().max(Comparator.comparingInt(String::length));
        System.out.println("最长的字符串是：" + longestString.orElse("没有找到符合条件的字符串"));
        //System.out.println("最长的字符串是：" + longestString.get());//不安全

        //5.获取Integer集合中最大值
        Optional<Integer> integerMax = nums.stream().max(Integer::compareTo);
        System.out.println("Integer集合中最大值是：" + integerMax.orElse(0));

        //6.获取员工工资最高的人
        Optional<Employee> highSalaryEmployee = employees.stream().max(Comparator.comparingDouble(Employee::getSalary));
        //使用orElse提供默认Employee对象
        System.out.println("工资最高的人：" + highSalaryEmployee.orElse(new Employee("无", 0,0.0)));
        //System.out.println("工资最高的人：" + highSalaryEmployee.get());  //不安全

        //7.计算Integer集合中大于6的元素的个数
        long count =nums.stream().filter(s -> s > 6).count();
        System.out.println("大于6的元素个数：" + count);

        //8.将员工按照工资由低到高排序，显示名字
        employees.stream().sorted(Comparator.comparingDouble(Employee::getSalary)).map(Employee::getName).forEach(System.out::println);
        //9.将员工按照工资由高到低排序，显示名字
        employees.stream().sorted(Comparator.comparingDouble(Employee::getSalary).reversed()).map(Employee::getName).forEach(System.out::println);
        //10.将员工按照工资由低到高（工资一样则按年龄由小到大）排序，显示名字
        employees.stream().sorted(Comparator.comparingDouble(Employee::getSalary).thenComparingInt(Employee::getAge)).map(Employee::getName).forEach(System.out::println);


    }


}

class Employee {
    private String name;
    private int age;
    private double salary;

    public Employee() {
    }

    public Employee(String name, int age, double salary) {
        this.name = name;
        this.age = age;
        this.salary = salary;
    }

    /**
     * 获取
     *
     * @return name
     */
    public String getName() {
        return name;
    }

    /**
     * 设置
     *
     * @param name
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * 获取
     *
     * @return age
     */
    public int getAge() {
        return age;
    }

    /**
     * 设置
     *
     * @param age
     */
    public void setAge(int age) {
        this.age = age;
    }

    /**
     * 获取
     *
     * @return salary
     */
    public double getSalary() {
        return salary;
    }

    /**
     * 设置
     *
     * @param salary
     */
    public void setSalary(double salary) {
        this.salary = salary;
    }

    public String toString() {
        return "Employee{name = " + name + ", age = " + age + ", salary = " + salary + "}";
    }
}

